home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Blender 2.49b / blender-2.49b-windows.exe / $_4_ / .blender / scripts / textplugin_outliner.py < prev    next >
Text File  |  2009-08-31  |  3KB  |  143 lines

  1. #!BPY
  2. """
  3. Name: 'Code Outline | Ctrl T'
  4. Blender: 246
  5. Group: 'TextPlugin'
  6. Shortcut: 'Ctrl+T'
  7. Tooltip: 'Provides a menu for jumping to class and functions definitions.'
  8. """
  9.  
  10. # Only run if we have the required modules
  11. try:
  12.     import bpy
  13.     from BPyTextPlugin import *
  14.     from Blender import Draw
  15. except ImportError:
  16.     OK = False
  17. else:
  18.     OK = True
  19.  
  20. def make_menu(items, eventoffs):
  21.     n = len(items)
  22.     if n < 20:
  23.         return [(items[i], i+1+eventoffs) for i in range(len(items))]
  24.     
  25.     letters = []
  26.     check = 'abcdefghijklmnopqrstuvwxyz_' # Names cannot start 0-9
  27.     for c in check:
  28.         for item in items:
  29.             if item[0].lower() == c:
  30.                 letters.append(c)
  31.                 break
  32.     
  33.     entries = {}
  34.     i = 0
  35.     for item in items:
  36.         i += 1
  37.         c = item[0].lower()
  38.         entries.setdefault(c, []).append((item, i+eventoffs))
  39.     
  40.     subs = []
  41.     for c in letters:
  42.         subs.append((c, entries[c]))
  43.     
  44.     return subs
  45.  
  46. def find_word(txt, word):
  47.     i = 0
  48.     txt.reset()
  49.     while True:
  50.         try:
  51.             line = txt.readline()
  52.         except StopIteration:
  53.             break
  54.         c = line.find(word)
  55.         if c != -1:
  56.             txt.setCursorPos(i, c)
  57.             break
  58.         i += 1
  59.  
  60. def main():
  61.     txt = bpy.data.texts.active
  62.     if not txt:
  63.         return
  64.     
  65.     # Identify word under cursor
  66.     if get_context(txt) == CTX_NORMAL:
  67.         line, c = current_line(txt)
  68.         start = c-1
  69.         end = c
  70.         while start >= 0:
  71.             if not line[start].lower() in 'abcdefghijklmnopqrstuvwxyz0123456789_':
  72.                 break
  73.             start -= 1
  74.         while end < len(line):
  75.             if not line[end].lower() in 'abcdefghijklmnopqrstuvwxyz0123456789_':
  76.                 break
  77.             end += 1
  78.         word = line[start+1:end]
  79.         if word in KEYWORDS:
  80.             word = None
  81.     else:
  82.         word = None
  83.     
  84.     script = get_cached_descriptor(txt)
  85.     items = []
  86.     desc = None
  87.     
  88.     tmp = script.classes.keys()
  89.     tmp.sort(cmp = suggest_cmp)
  90.     class_menu = make_menu(tmp, len(items))
  91.     class_menu_length = len(tmp)
  92.     items.extend(tmp)
  93.     
  94.     tmp = script.defs.keys()
  95.     tmp.sort(cmp = suggest_cmp)
  96.     defs_menu = make_menu(tmp, len(items))
  97.     defs_menu_length = len(tmp)
  98.     items.extend(tmp)
  99.     
  100.     tmp = script.vars.keys()
  101.     tmp.sort(cmp = suggest_cmp)
  102.     vars_menu = make_menu(tmp, len(items))
  103.     vars_menu_length = len(tmp)
  104.     items.extend(tmp)
  105.     
  106.     menu = [('Script %t', 0),
  107.             ('Classes', class_menu),
  108.             ('Functions', defs_menu),
  109.             ('Variables', vars_menu)]
  110.     if word:
  111.         menu.extend([None, ('Locate', [(word, -10)])])
  112.     
  113.     i = Draw.PupTreeMenu(menu)
  114.     if i == -1:
  115.         return
  116.     
  117.     # Chosen to search for word under cursor
  118.     if i == -10:
  119.         if script.classes.has_key(word):
  120.             desc = script.classes[word]
  121.         elif script.defs.has_key(word):
  122.             desc = script.defs[word]
  123.         elif script.vars.has_key(word):
  124.             desc = script.vars[word]
  125.         else:
  126.             find_word(txt, word)
  127.             return
  128.     else:
  129.         i -= 1
  130.         if i < class_menu_length:
  131.             desc = script.classes[items[i]]
  132.         elif i < class_menu_length + defs_menu_length:
  133.             desc = script.defs[items[i]]
  134.         elif i < class_menu_length + defs_menu_length + vars_menu_length:
  135.             desc = script.vars[items[i]]
  136.     
  137.     if desc:
  138.         txt.setCursorPos(desc.lineno-1, 0)
  139.  
  140. # Check we are running as a script and not imported as a module
  141. if __name__ == "__main__" and OK:
  142.     main()
  143.